import { arrayMethods } from './array.js'
class Observer {
  constructor(data) {
    Object.defineProperty(data, '__ob__', {
      value: this,
      enumerable: false,
      configurable: false
    })
    if (Array.isArray(data)) {
      // 考虑数组方法的数据劫持
      data.__proto__ = arrayMethods
      this.observeArray(data)
    } else {
      this.walk(data)
    }
  }

  // Observer类 开始执行
  // 劫持的是data选项数据
  walk(data) {
    Object.keys(data).forEach(key => {
      defineReactive(data, key, data[key])
    })
  }

  observeArray(value) {
    for (let i = 0; i < value.length; i++) {
      observe(value[i])
    }
  }
}

// 封装数据劫持
function defineReactive(data, key, value) {
  observe(value)
  Object.defineProperty(data, key, {
    get() {
      console.log('get')
      return value
    },
    set(newVal) {
      console.log('set')
      if (newVal == value) return
      observe(value)
      value = newVal
    }
  })
}

export function observe(data) {
  // 1. 先判断data是否为对象，因为只会对对象数据进行监测
  if (typeof data !== 'object' || data === null) {
    return
  }
  if (data.__ob__) {
  }
  new Observer(data)
}
